package admin

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"goadmin/models"
	"goadmin/utils"
	"golang.org/x/crypto/bcrypt"
	"net/http"
)

type AdminUserController struct {
	BaseController
}

// 用户分页列表
func (con AdminUserController) Index(c *gin.Context) {
	userList := []models.AdminUser{}
	pageInfo, _ := c.Get("pageRequest")
	pageData := pageInfo.(gin.H)
	page := pageData["page"].(int)
	pageSize := pageData["pageSize"].(int)
	res := models.DB.Scopes(utils.Paginate(page, pageSize)).Find(&userList)
	if res.Error != nil {
		con.errorMessage(c, "查询列表异常", 201)
		return
	}
	con.pageSuccess(c, userList, res.RowsAffected)
}

func (con AdminUserController) UpdateUser(c *gin.Context) {
	var req struct {
		ID              uint   `json:"id" binding:"required"`
		Name            string `json:"name" binding:"required"`
		Mobile          string `json:"mobile" binding:"required,number,len=11"`
		Password        string `json:"password" binding:"required,min=6"`
		ConfirmPassword string `json:"confirm_password" binding:"required,eqfield=Password"`
		RoleID          int    `json:"role_id" binding:"required" form:"role_id"`
	}

	if err := c.ShouldBindJSON(&req); err != nil {
		con.errorMessage(c, err.Error(), 201)
		return
	}
	userInfo := models.AdminUser{}
	models.DB.Where("name = ?", req.Name).First(&userInfo)
	if userInfo.ID != req.ID {
		con.errorMessage(c, "已经存在该账号,请更换账号", 201)
		return
	}
	hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)
	updateData := map[string]interface{}{
		"Name":     req.Name,
		"Mobile":   req.Mobile,
		"Password": string(hashedPassword), // 使用加密后的密码
		"RoleID":   req.RoleID,
	}
	result := models.DB.Model(&models.AdminUser{}).Where("id = ?", req.ID).Updates(updateData)
	if result.Error != nil {
		// 数据库错误（如连接问题、约束冲突等）
		con.errorMessage(c, "程序错误", 201)
		return
	}
	if result.RowsAffected == 0 {
		// 没有记录被更新（可能是ID不存在或新值与旧值相同）
		con.errorMessage(c, "数据未更新", 201)
		return
	}
	con.successMessage(c, "更新成功", nil)
}
func (con AdminUserController) DeleteUser(c *gin.Context) {
	id := c.Param("id")
	if id == "" {
		con.errorMessage(c, "Id有误", 201)
		return
	}
	result := models.DB.Delete(&models.AdminUser{}, id)
	if result.Error != nil {
		// 数据库错误（如连接问题、约束冲突等）
		c.JSON(http.StatusOK, gin.H{
			"msg":   "程序错误",
			"error": result.Error,
			"code":  201,
		})
		return
	}
	if result.RowsAffected == 0 {
		// 没有记录被更新（可能是ID不存在或新值与旧值相同）
		con.errorMessage(c, "数据未更新", 201)
		return
	}
	con.successMessage(c, "删除成功", nil)
}
func (con AdminUserController) Register(c *gin.Context) {
	var req struct {
		Name            string `json:"name" binding:"required"`
		Mobile          string `json:"mobile" binding:"required,number,len=11"`
		Password        string `json:"password" binding:"required,min=6"`
		ConfirmPassword string `json:"confirm_password" binding:"required,eqfield=Password"`
		RoleID          int    `json:"role_id" binding:"required" form:"role_id"`
	}
	userInfo := []models.AdminUser{}
	fmt.Printf("Parsed request--->>: %+v\n", req.Mobile)
	fmt.Printf("Parsed request--->>: %+v\n", req.Name)
	if err := c.ShouldBindJSON(&req); err != nil {
		con.errorMessage(c, err.Error(), 201)
		return
	}

	models.DB.Where("name = ?", req.Name).Find(&userInfo)
	if len(userInfo) > 0 {
		con.errorMessage(c, "已经存在该账号,请更换账号", 201)
		return
	}
	hashedPassword, _ := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)
	updateData := map[string]interface{}{
		"Name":     req.Name,
		"Mobile":   req.Mobile,
		"Password": string(hashedPassword), // 使用加密后的密码
		"RoleID":   req.RoleID,
	}
	result := models.DB.Model(&models.AdminUser{}).Create(updateData)
	if result.Error != nil {
		// 数据库错误（如连接问题、约束冲突等）
		con.errorMessage(c, "程序错误,插入失败", 201)
		return
	}
	if result.RowsAffected == 0 {
		// 没有记录被更新（可能是ID不存在或新值与旧值相同）
		con.errorMessage(c, "数据未更新", 201)
		return
	}
	con.successMessage(c, "添加成功", nil)
}
